'use client'; import { useForm, SubmitHandler, Controller } from 'react-hook-form'; import { yupResolver } from '@hookform/resolvers/yup'; import * as yup from 'yup'; import { useCancelOrderMutation, useGetOrderQuery, useGetCancellationReasonsQuery } from '@akinon/next/data/client/account'; import type { AccountOrderCancellation } from '@akinon/next/types'; import { Button, Checkbox, Select, Modal, LoaderSpinner, Link, FileInput } from '@theme/components'; import { useState } from 'react'; import { useParams } from 'next/navigation'; import { OrderDetailHeader } from '@theme/views/account/orders/order-detail-header'; import { OrderCancellationItem } from '@theme/views/account/orders/order-cancellation-item'; import { useLocalization } from '@akinon/next/hooks'; const accountOrderCancellationSchema = yup.object().shape({ return_policy: yup.boolean().oneOf([true], 'This field is required.') }); const AccountOrderCancellation = () => { const params = useParams<{ id: string }>(); const { t } = useLocalization(); const { register, handleSubmit, control, watch, getValues, setValue, formState: { errors } } = useForm({ resolver: yupResolver(accountOrderCancellationSchema) }); const { data: cancellationReasons, isSuccess: cancellationReasonsSuccess } = useGetCancellationReasonsQuery(); const { data: order, isLoading, isSuccess: orderSuccess } = useGetOrderQuery(params.id); const [isModalOpen, setIsModalOpen] = useState(false); const [responseMessage, setResponseMessage] = useState({ title: '', content: '' }); const watchAllFields = watch(); const cancelItemsLength = watchAllFields?.cancel_order_items?.length; const [cancelOrder] = useCancelOrderMutation(); const [files, setFiles] = useState< { itemId: string; image: string; description: string }[] >([]); const modalHandleClick = () => { setIsModalOpen(false); location.reload(); }; const selectCondition = (item, isActive, cancellationType) => { const cancelReasons = cancellationReasons.results .filter((item) => item.cancellation_type === cancellationType) .map((item) => { return { label: item.subject, value: String(item.id) }; }); if (item.active_cancellation_request?.easy_return?.code) { return (
{t('account.my_orders.return.return_code')}:
{item.active_cancellation_request.easy_return.code}
); } else if (item.is_cancelled) { return
{t('account.my_orders.return.cancelled')}
; } else if ( !item.is_cancelled && item.active_cancellation_request?.cancellation_type?.value == 'cancel' ) { return (
{t('account.my_orders.return.cancellation_request_recieved')}
); } else if (item.is_cancellable || item.is_refundable) { return ( ); } }; const handleChange = (e, item) => { setValue('cancel_order_items', [ ...getValues('cancel_order_items').map((val) => { if (val.order_item === item.id) { val.reason = e.target.value; } return val; }) ]); }; const handleFileChange = async ( e: React.ChangeEvent, itemId: string, description: string ) => { const selectedFiles = Array.from(e.target.files || []); const base64Files = await Promise.all( selectedFiles.map((file) => { return new Promise((resolve, reject) => { const reader = new FileReader(); reader.onload = () => resolve(reader.result as string); reader.onerror = reject; reader.readAsDataURL(file); }); }) ); const validFiles = base64Files.filter((file) => /^data:image\/(jpeg|png|jpg);base64,.+/.test(file) ); const formattedFiles = validFiles.map((file) => ({ itemId, image: file, description })); setFiles((prevFiles) => [ ...prevFiles.filter((f) => f.itemId !== itemId), ...formattedFiles ]); }; const fileInputCondition = (item, description: string) => { if (item.is_refundable && !item.active_cancellation_request) { return ( ) => handleFileChange(e, item.id, description) } /> ); } }; const onSubmit: SubmitHandler = (orderItems) => { const mergedData = { ...orderItems, cancel_order_items: orderItems.cancel_order_items.map((orderItem) => ({ ...orderItem, ...(files.length > 0 && { cancellation_request_image_set: files.filter( (file) => file.itemId === orderItem.order_item ) }) })) }; cancelOrder({ id: order.number, ...mergedData }) .unwrap() .then(() => { setResponseMessage({ title: t('account.my_orders.return.success.title').toString(), content: t('account.my_orders.return.success.description').toString() }); setIsModalOpen(true); }) .catch((err) => { console.error('Err', err); const errorMessages = new Set(); if (err?.data?.cancel_order_items) { err.data.cancel_order_items.forEach((item) => { if (item.cancellation_request_image_set) { item.cancellation_request_image_set.forEach((error) => { if (typeof error === 'string') { errorMessages.add(error); } else if (typeof error === 'object' && error?.image) { error.image.forEach((msg) => errorMessages.add(msg)); } }); } }); } const errorContent = errorMessages.size > 0 ? Array.from(errorMessages).join('\n') : t('account.my_orders.return.error.description').toString(); setResponseMessage({ title: t('account.my_orders.return.error.title').toString(), content: errorContent }); setIsModalOpen(true); }); }; if (isLoading) { return ; } if (orderSuccess && cancellationReasonsSuccess) { return ( <>
{order?.orderitem_set?.length} {' '} {t('account.my_orders.detail.products')}
{order?.orderitem_set?.map((item, index: number) => ( { const isActive = value.some((cancelItem) => { return cancelItem.order_item === item.id; }); const cancellationType = item?.is_refundable ? 'refund' : 'cancel'; const selectOption = selectCondition( item, !isActive, cancellationType ); return ( ); }} /> ))}
{t('account.my_orders.return.contract_process_cancel')}
{errors.return_policy && (
{String(errors.return_policy.message)}
)}

{responseMessage.title}

{responseMessage.content}

); } }; export default AccountOrderCancellation;